# 使用二分法计算平方根的函数
# 参数:
#   square_target: 需要计算平方根的目标数值
#   tolerance: 容差，控制计算精度，默认值为1e-7
#   max_iterations: 最大迭代次数，防止无限循环，默认值为100
def square_root_bisection(square_target, tolerance=1e-7, max_iterations=100):
    # 处理负数情况：在实数范围内负数没有平方根
    if square_target < 0:
        raise ValueError(
            'Square root of negative number is not defined in real numbers')

    # 特殊情况处理：平方根为1
    if square_target == 1:
        root = 1
        print(f'The square root of {square_target} is 1')
    # 特殊情况处理：平方根为0
    elif square_target == 0:
        root = 0
        print(f'The square root of {square_target} is 0')

        # 一般情况：使用二分法计算平方根
    else:
        # 设置初始搜索区间
        # 下界设为0
        low = 0
        # 上界设为目标值和1中的较大者（处理0-1之间的数）
        high = max(1, square_target)
        # 初始化根变量
        root = None

        # 二分法迭代计算
        # 最多迭代max_iterations次
        for _ in range(max_iterations):
            # 计算中间值
            mid = (low + high) / 2
            # 计算中间值的平方
            square_mid = mid**2

            # 检查是否达到精度要求
            # 如果中间值的平方与目标值的差小于容差，则找到近似根
            if abs(square_mid - square_target) < tolerance:
                root = mid
                break

            # 如果中间值的平方小于目标值，说明根在右侧区间
            elif square_mid < square_target:
                low = mid
            # 如果中间值的平方大于目标值，说明根在左侧区间
            else:
                high = mid

        # 检查是否在最大迭代次数内收敛
        if root is None:
            print(f"Failed to converge within {max_iterations} iterations.")

        # 输出结果
        else:
            print(
                f'The square root of {square_target} is approximately {root}')

    # 返回计算得到的平方根
    return root


# 示例：计算16的平方根
N = 16
# 调用函数进行计算
square_root_bisection(N)
